#define _PARTAB_MODULE_
#include "par_tab.h"
 
/*
 * jump list
*/
par_jump_list_type par_jump_list[] = 
{
    {0,0},
    {0,0},
    {0,0},
    {0,0},
    {0,0},
    {0,0},
    {0,0},
    {0,0},
};

/*******************************************************************************
* @brief  par min get
* \param[in] par_num : par index, 
* \retval: ok / err
*******************************************************************************/
uint8_t par_check(uint16_t par_num, int32_t par_val)
{

    int32_t MaxVal;
    int32_t MinVal;

    MaxVal = par_max_get(par_num);
    MinVal = par_min_get(par_num);

    if ((PAR_SYS_TL_POS == par_num) || (PAR_SYS_TH_POS == par_num))
    {
        if (par_tab[PAR_SYS_CF_POS].iVal)
        {
            MaxVal = (int32_t)((float)MaxVal * 1.8f + 320.0f);
            MinVal = (int32_t)((float)MinVal * 1.8f + 320.0f);
        }
    }

    if (par_val < MinVal)
        return 0x00;
	
    if (par_val > MaxVal)
        return 0x00;

    return 0x01;
}

/*******************************************************************************
* @brief  par correct
* \param[in] par_num : par index, 
* \retval: value
*******************************************************************************/
int32_t par_correct(uint16_t par_num, int32_t par_val)
{
    int32_t MaxVal;
    int32_t MinVal;

    MaxVal = par_max_get(par_num);
    MinVal = par_min_get(par_num);

    if (par_val < MinVal)
        par_val = MinVal;
	
    if (par_val > MaxVal)
        par_val = MaxVal;

    return par_val;
}


/*******************************************************************************
* @brief  par attr get
* \param[in] par_num : par index, 
* \retval: attr
*******************************************************************************/
uint16_t par_attr_get(uint16_t par_num)
{
    return par_attr_tab[par_num].attr;
}

/*******************************************************************************
* @brief  par min get
* \param[in] par_num : par index, 
* \retval: value
*******************************************************************************/
int32_t par_min_get(uint16_t par_num)
{
    int32_t min;

    if (par_attr_tab[par_num].attr & PAR_ATTR_32BIT)
    {
        min = par_attr_tab[par_num].min + par_attr_tab[par_num + 0x01].min * 10000;
    }
    else
    {
        min = par_attr_tab[par_num].min;
    }
    return min;
}

/*******************************************************************************
* @brief  par max get
* \param[in] par_num : par index, 
* \retval: value
*******************************************************************************/
int32_t par_max_get(uint16_t par_num)
{
    int32_t max;

    if (par_attr_tab[par_num].attr & PAR_ATTR_32BIT)
    {
        max = par_attr_tab[par_num].max + par_attr_tab[par_num + 0x01].max * 10000;
    }
    else
    {
        max = par_attr_tab[par_num].max;
    }
    return max;
}

/*******************************************************************************
* @brief  par value get
* \param[in] par_num : par index, 
* \retval: value
*******************************************************************************/
int32_t par_val_get(uint16_t par_num)
{
    dword_tt val;

    if (par_attr_tab[par_num].attr & PAR_ATTR_32BIT)
    {
        val.uVal = par_tab[par_num].uVal + (par_tab[par_num + 0x01].uVal << 16);
    }
    else
    {
        val.iVal = par_tab[par_num].iVal;
    }
    return val.iVal;

}

/*******************************************************************************
* @brief  par value set
* \param[in] par_num : par index, 
* \param[in] par_val : par value, 
* \retval: value
*******************************************************************************/
int32_t par_val_set(uint16_t par_num, int32_t par_val)
{
	dword_tt val;
	
    val.iVal = par_val;

    if (par_attr_tab[par_num].attr & PAR_ATTR_32BIT)
    {
        par_tab[par_num].uVal = val.word.LW.uVal;
        par_tab[par_num + 0x01].uVal = val.word.HW.uVal;
		
		// save sync
		eep_par_save(par_num * 2, par_tab[par_num].uVal);
		eep_par_save(par_num * 2 + 2, par_tab[par_num + 1].uVal);
    }
    else
    {
        par_tab[par_num].iVal = val.iVal;
		
		// save sync
		eep_par_save(par_num * 2, par_tab[par_num].uVal);
    }

    return val.iVal;
}
